/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controllers;

import concursos.configuracao.ItemConfiguracao;
import controllers.exceptions.NonexistentEntityException;
import controllers.exceptions.PreexistingEntityException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import concursos.configuracao.Configuracao;

/**
 *
 * @author lucena
 */
public class ItemConfiguracaoJpaController {

    public ItemConfiguracaoJpaController() {
        emf = Persistence.createEntityManagerFactory("concursosPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(ItemConfiguracao itemConfiguracao) throws PreexistingEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Configuracao configuracao = itemConfiguracao.getConfiguracao();
            if (configuracao != null) {
                configuracao = em.getReference(configuracao.getClass(), configuracao.getId());
                itemConfiguracao.setConfiguracao(configuracao);
            }
            em.persist(itemConfiguracao);
            if (configuracao != null) {
                configuracao.getItens().add(itemConfiguracao);
                configuracao = em.merge(configuracao);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findItemConfiguracao(itemConfiguracao.getId()) != null) {
                throw new PreexistingEntityException("ItemConfiguracao " + itemConfiguracao + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(ItemConfiguracao itemConfiguracao) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ItemConfiguracao persistentItemConfiguracao = em.find(ItemConfiguracao.class, itemConfiguracao.getId());
            Configuracao configuracaoOld = persistentItemConfiguracao.getConfiguracao();
            Configuracao configuracaoNew = itemConfiguracao.getConfiguracao();
            if (configuracaoNew != null) {
                configuracaoNew = em.getReference(configuracaoNew.getClass(), configuracaoNew.getId());
                itemConfiguracao.setConfiguracao(configuracaoNew);
            }
            itemConfiguracao = em.merge(itemConfiguracao);
            if (configuracaoOld != null && !configuracaoOld.equals(configuracaoNew)) {
                configuracaoOld.getItens().remove(itemConfiguracao);
                configuracaoOld = em.merge(configuracaoOld);
            }
            if (configuracaoNew != null && !configuracaoNew.equals(configuracaoOld)) {
                configuracaoNew.getItens().add(itemConfiguracao);
                configuracaoNew = em.merge(configuracaoNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                long id = itemConfiguracao.getId();
                if (findItemConfiguracao(id) == null) {
                    throw new NonexistentEntityException("The itemConfiguracao with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ItemConfiguracao itemConfiguracao;
            try {
                itemConfiguracao = em.getReference(ItemConfiguracao.class, id);
                itemConfiguracao.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The itemConfiguracao with id " + id + " no longer exists.", enfe);
            }
            Configuracao configuracao = itemConfiguracao.getConfiguracao();
            if (configuracao != null) {
                configuracao.getItens().remove(itemConfiguracao);
                configuracao = em.merge(configuracao);
            }
            em.remove(itemConfiguracao);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<ItemConfiguracao> findItemConfiguracaoEntities() {
        return findItemConfiguracaoEntities(true, -1, -1);
    }

    public List<ItemConfiguracao> findItemConfiguracaoEntities(int maxResults, int firstResult) {
        return findItemConfiguracaoEntities(false, maxResults, firstResult);
    }

    private List<ItemConfiguracao> findItemConfiguracaoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from ItemConfiguracao as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public ItemConfiguracao findItemConfiguracao(long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ItemConfiguracao.class, id);
        } finally {
            em.close();
        }
    }

    public int getItemConfiguracaoCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from ItemConfiguracao as o").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
